package com.neusoft.chenanqi.service;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.neusoft.chenanqi.dao.EmpSalaryDao;
import com.neusoft.chenanqi.dao.SalItemDao;
import com.neusoft.chenanqi.dto.EmpSalDto;
import com.zero.basic.exception.SmsErrorConstant;
import com.zero.basic.exception.SmsRuntimeException;
import com.zero.basic.exception.SmsStatusCode;
import com.zero.basic.model.Pager;
import com.zero.mms.model.EmpSalary;
import com.zero.mms.model.SalaryItem;

@Service("fixedSalService")
public class FixedSalServiceImpl implements FixedSalService {

	@Inject
	private EmpSalaryDao empSalaryDao;
	
	@Inject
	private SalItemDao salItemDao;
	
	// 根据条件查询固定工资列表
	@Override
	public Pager<EmpSalDto> listFixedSal(String depName, String empNo,
			String month, String salFrom, String salTo)
			throws SmsRuntimeException {
		try {
			if (depName == null) {
				depName = "*";
			}
			if (empNo == null) {
				empNo = "*";
			}
			if (month == null) {
				month = "*";
			}
			
			//判断是否有固定工资范围条件
			Double minSal = null;
			Double maxSal = null;
			if (!"*".equals(salFrom) && !"".equals(salFrom) && salFrom != null) {
				minSal = Double.parseDouble(salFrom);
			}
			if (!"*".equals(salTo) && !"".equals(salTo) && salTo != null) {
				maxSal = Double.parseDouble(salTo);
			}
			
			// 获得固定工资记录的人员月份信息
			Pager<EmpSalDto> empSalDtoPager = empSalaryDao.listEmpSal(depName, empNo, month, minSal, maxSal, "固定");
			
			// 获取固定工资项目名称列表
			List<SalaryItem> salaryItemList = salItemDao.listSalItemByType("固定");
			List<String> fixedSalaryItemName = new ArrayList<String>();
			for (SalaryItem salaryItem : salaryItemList) {
				fixedSalaryItemName.add(salaryItem.getSalaryItemName());
			}
			
			// 获得每条固定工资记录的所有固定工资项目值
			List<EmpSalDto> empSalDtoList = empSalDtoPager.getDatas();
			for (EmpSalDto empSalDto : empSalDtoList) {
				empSalDto.setSalItemName(fixedSalaryItemName);
				for (String fixedSalName : fixedSalaryItemName) {
					EmpSalary empSalary = empSalaryDao.getEmpSalByEmpNoMonthAndItemName(empSalDto.getEmpNo().toString(), 
							empSalDto.getMonth(), fixedSalName);
					
					if (empSalary == null || empSalary.getEmpSalaryNum() == null || "".equals(empSalary.getEmpSalaryNum())) {
						empSalDto.addsalItemValue("0");
					} else {
						empSalDto.addsalItemValue(empSalary.getEmpSalaryNum());
					}
				}
			}
			
			return empSalDtoPager;
		} catch (NumberFormatException e)  {
			e.printStackTrace();
			throw new SmsRuntimeException(SmsStatusCode.INVALID_CODE,
					SmsErrorConstant.INVALID_AUGUMENT, "工资范围输入错误");
		} catch (Exception e) {
			e.printStackTrace();
			throw new SmsRuntimeException(SmsStatusCode.SERVER_ERROR,
					SmsErrorConstant.WEB_APPLICATION, "查询固定工资列表失败");
		}
	}

	// 更新固定工资信息
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void updateFixedSal(String empNo, String month,
			String[] fixedSalName, String[] fixedSalValue)
			throws SmsRuntimeException {
		try {
			for (int i = 0; i < fixedSalName.length; i++) {
				if (!"*".equals(fixedSalValue[i]) && !"".equals(fixedSalValue[i])) {
					EmpSalary empSalary = empSalaryDao.getEmpSalByEmpNoMonthAndItemName(empNo, month, fixedSalName[i]);
					if (empSalary == null) {
						empSalary = new EmpSalary();
						Integer empId = Integer.parseInt("empNo");
						empSalary.setEmpId(empId);
						empSalary.setEmpSalaryDate(month);
						SalaryItem salaryItem = salItemDao.getSalItemByName(fixedSalName[i]);
						empSalary.setSalaryItemId(salaryItem.getSalaryItemId().toString());
						empSalaryDao.add(empSalary);
					} else {
						empSalary.setEmpSalaryNum(fixedSalValue[i]);
						empSalaryDao.update(empSalary);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new SmsRuntimeException(SmsStatusCode.SERVER_ERROR,
					SmsErrorConstant.WEB_APPLICATION, "更新固定工资信息失败");
		}
	}

}
